
#ifndef LEDMAP_H
#define LEDMAP_H

// maidoo：双极性复用的LED数码管，又称阴阳脚数码管，能最大限度地减少IO引脚数量。
// 缺点是驱动略微复杂。另外每个IO同时点亮的LED数量不确定，无法用简单串联限流电阻的方法控制亮度

//数码管中的LED总数，7脚的数码管最多能有 7*6=42个，6脚最多30个，5脚最多20个
#define COUNTOF_LED             37

//LED数码管的引脚，对应的就是单片机的需要的IO总数
#define IO_NUM7                 7

//日字数码管中段码数量，仅数字就是7段，如包含小数点就是8段
#define SEG_NUM7                7


#define IO_NUM_PREV(n)          ((n) <= 0 ? (IO_NUM7 - 1) : (n) - 1)
#define IO_NUM_NEXT(n)          ((n) >= (IO_NUM7 - 1) ? 0 : (n) + 1)

typedef struct OneDotInfo {
    unsigned char pinA;         // 正极引脚号，1~7
    unsigned char pinK;         // 负极引脚号，1~7
} OneDotInfo_t;

/* ---- LED点位矩阵，代表屏幕上的37个DOT点位，每个点位的A正极引脚号和K负极引脚号 -------------------
   要求四个日字管的7个点位按序列排在前面，以匹配 data4_to_7x7arr_decode()函数的寻址操作。 ---- */
const OneDotInfo_t led_map[] = {
    {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {5, 6},     // a1, b1, c1, d1, e1, f1, g1
    {2, 1}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {5, 7},     // a2, b2, c2, d2 ,e2, f2, g2
    {3, 1}, {3, 2}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {6, 7},     // a3 ~ g3
    {4, 1}, {4, 2}, {4, 3}, {4, 5}, {4, 6}, {4, 7}, {6, 5},     // a4 ~ g4
    {7, 1},                 // 冒号，紧接着四个日字管。下标28，便于 led_set_colon() 函数寻址
    {7, 2},                 // 点
    {6, 1}, /*闹钟*/        {6, 2}, /*亏电*/        {6, 3}, /*满电*/
    {5, 1}, /*BT*/          {5, 2}, /*TF*/          {5, 3}, /*FM*/      {5, 4} /*AUX*/,
    {0, 0}  /*最后补全0表示结尾*/
};


// 显示缓存，按照引脚索引，便于扫描程序快速处理。数据设置为在pinA正极为公共极扫描时，对应的pinK负极
// 0=不显示（高阻态），1=点亮该LED点位（负极拉低）。3=PWM调制输出（仅公共极正极）。其它值无意义。
typedef uint8_t display_cache_t[IO_NUM7 /*pinA正极*/][IO_NUM7 /*pinK负极*/];
display_cache_t display_cache  = { 0 };



#endif // LEDMAP_H
